package com.teng.smartdrawer.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;

import com.teng.smartdrawer.R;
import com.teng.smartdrawer.utils.MetricsUtil;


/**
 * 自定义加载更多listview 添加footer配合actionbarPulltoRefresh
 *
 * @author hackest
 */

public class LoadMoreListView extends ListView implements OnScrollListener {

    private static final String TAG = "LoadMoreListView";

    /**
     * Listener that will receive notifications every time the list scrolls.
     */
    private OnScrollListener mOnScrollListener;
    private LayoutInflater mInflater;

    // footer view
    private RelativeLayout mFooterView;
    private LinearLayout mLabLoadMore;
    // private ProgressBar mProgressBarLoadMore;
    private View moreinfo;
    private ImageView progresBarWait;
    private Animation rotation;

    // Listener to process load more items when user reaches the end of the list
    private OnLoadMoreListener mOnLoadMoreListener;
    // To know if the list is loading more items
    private boolean mIsLoadingMore = false;

    private boolean mCanLoadMore = true;
    private int mCurrentScrollState;

    public LoadMoreListView(Context context) {
        super(context);
        init(context);
    }

    public LoadMoreListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public LoadMoreListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context context) {
        MetricsUtil.getCurrentWindowMetrics(context);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // footer
        mFooterView = (RelativeLayout) mInflater.inflate(R.layout.activity_homepage_moreinfo, this, false);
        mLabLoadMore = (LinearLayout) mFooterView.findViewById(R.id.more_info_null);
        // mProgressBarLoadMore = (ProgressBar)
        // mFooterView.findViewById(R.id.load_more_progressBar);
        moreinfo = mFooterView.findViewById(R.id.more_info_linear);
        addFooterView(mFooterView);
        ViewGroup.LayoutParams localLayoutParams1 = this.mLabLoadMore.getLayoutParams();
        localLayoutParams1.height = (int) (MetricsUtil.getCurrentHeightSize((int) getResources().getDimension(R.dimen.activity_splash_textview_logoname_margin_bottom)) * MetricsUtil.CURRENT_DENSITY
                / 160.0D);
        mLabLoadMore.setLayoutParams(localLayoutParams1);

        ViewGroup.LayoutParams localLayoutParams2 = this.moreinfo.getLayoutParams();
        localLayoutParams2.height = (int) (MetricsUtil.getCurrentHeightSize((int) getResources().getDimension(R.dimen.activity_splash_textview_logoname_margin_bottom)) * MetricsUtil.CURRENT_DENSITY
                / 160.0D);
        moreinfo.setLayoutParams(localLayoutParams2);
        progresBarWait = (ImageView) mFooterView.findViewById(R.id.more_info_progress);
        rotation = AnimationUtils.loadAnimation(context, R.anim.progress_anim);
        rotation.setRepeatCount(-1);
        super.setOnScrollListener(this);
    }

    @Override
    public void setAdapter(ListAdapter adapter) {
        super.setAdapter(adapter);
    }

    /**
     * Set the listener that will receive notifications every time the list
     * scrolls.
     *
     * @param l The scroll listener.
     */
    @Override
    public void setOnScrollListener(OnScrollListener l) {
        mOnScrollListener = l;
    }

    /**
     * Register a callback to be invoked when this list reaches the end (last
     * item be visible)
     *
     * @param onLoadMoreListener The callback to run.
     */

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        mOnLoadMoreListener = onLoadMoreListener;
    }

    @SuppressLint("ShowToast")
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        if (mOnScrollListener != null) {
            mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
        }

        if (mOnLoadMoreListener != null) {

            if (visibleItemCount == totalItemCount) {
                moreinfo.setVisibility(View.INVISIBLE);
                mLabLoadMore.setVisibility(View.VISIBLE);
                return;
            }

            boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;

            if (!mIsLoadingMore && loadMore && mCurrentScrollState != SCROLL_STATE_IDLE) {
                if (!mCanLoadMore) {
                    mLabLoadMore.setVisibility(View.VISIBLE);
                    return;
                }
                moreinfo.setVisibility(View.VISIBLE);
                progresBarWait.startAnimation(this.rotation);
                mLabLoadMore.setVisibility(View.GONE);
                mIsLoadingMore = true;
                onLoadMore();
            }

        }

    }

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        mCurrentScrollState = scrollState;

        if (mOnScrollListener != null) {
            mOnScrollListener.onScrollStateChanged(view, scrollState);
        }

    }

    public void setCanLoadMore(boolean canLoadMore) {
        mCanLoadMore = canLoadMore;
        if (!mCanLoadMore) {
            mLabLoadMore.setVisibility(View.VISIBLE);
        } else {
            mLabLoadMore.setVisibility(View.INVISIBLE); // 底部加载更多
        }
    }

    public void onLoadMore() {
        Log.d(TAG, "onLoadMore");
        if (mOnLoadMoreListener != null) {
            mOnLoadMoreListener.onLoadMore();
        }
    }

    /**
     * Notify the loading more operation has finished
     */
    public void onLoadMoreComplete() {
        mIsLoadingMore = false;
        moreinfo.setVisibility(View.GONE);
        progresBarWait.clearAnimation();
    }

    /**
     * Interface definition for a callback to be invoked when list reaches the
     * last item (the user load more items in the list)
     */
    public interface OnLoadMoreListener {
        /**
         * Called when the list reaches the last item (the last item is visible
         * to the user)
         */
        public void onLoadMore();
    }

}